/*
 * Userconfig.h
 *
 *  Created on: 2020年8月24日
 *      Author: GAN005398
 */

#ifndef INC_USERCONFIG_H_
#define INC_USERCONFIG_H_






/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "can.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "FreeRTOSConfig.h"
#include "stm32f1xx_hal_conf.h"
#include "stm32f1xx_it.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_can.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include"DS18B20.h"
/* USER CODE END Includes */

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t  u8;

/*******************************************************
位带操作
¾ßÌåÊµÏÖË¼Ïë,²Î¿¼<<CM3È¨ÍþÖ¸ÄÏ>>µÚÎåÕÂ(87Ò³~92Ò³).
********************************************************/
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO口操作，只对单一的IO口
//确保n的值小于16
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入




/*定义LED全局控制*/
#define LED0 PCout(0)
#define LED1 PCout(1)
#define LED2 PCout(2)
#define LED3 PCout(3)
#define LED4 PCout(4)
#define LED5 PCout(5)
#define LED6 PCout(6)
#define LED7 PCout(7)



/*485控制   */
#define RS485CTR_CLR	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)   //CTR 置低  接收状态
#define RS485CTR_SET	   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)    //CTR 置高   发送状态

/*宏定义区 --------------------------------------------------------------------*/
#define NRF24L01_SPIx                                 SPI1
#define NRF24L01_SPIx_RCC_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()
#define NRF24L01_SPIx_RCC_CLK_DISABLE()               __HAL_RCC_SPI1_CLK_DISABLE()

#define NRF24L01_SPI_GPIO_ClK_ENABLE()                __HAL_RCC_GPIOA_CLK_ENABLE()
#define NRF24L01_SPI_GPIO_PORT                        GPIOA
#define NRF24L01_SPI_SCK_PIN                          GPIO_PIN_5
#define NRF24L01_SPI_MISO_PIN                         GPIO_PIN_6
#define NRF24L01_SPI_MOSI_PIN                         GPIO_PIN_7

#define NRF24L01_SPI_CS_CLK_ENABLE()                  __HAL_RCC_GPIOB_CLK_ENABLE()
#define NRF24L01_SPI_CS_PORT                          GPIOB
#define NRF24L01_SPI_CS_PIN                           GPIO_PIN_5
#define NRF24L01_SPI_CS_ENABLE()                      HAL_GPIO_WritePin(NRF24L01_SPI_CS_PORT, NRF24L01_SPI_CS_PIN, GPIO_PIN_RESET)
#define NRF24L01_SPI_CS_DISABLE()                     HAL_GPIO_WritePin(NRF24L01_SPI_CS_PORT, NRF24L01_SPI_CS_PIN, GPIO_PIN_SET)

#define NRF24L01_CE_CLK_ENABLE()                      __HAL_RCC_GPIOD_CLK_ENABLE()
#define NRF24L01_CE_PORT                              GPIOD
#define NRF24L01_CE_PIN                               GPIO_PIN_2
#define NRF24L01_CE_LOW()                             HAL_GPIO_WritePin(NRF24L01_CE_PORT, NRF24L01_CE_PIN, GPIO_PIN_RESET)
#define NRF24L01_CE_HIGH()                            HAL_GPIO_WritePin(NRF24L01_CE_PORT, NRF24L01_CE_PIN, GPIO_PIN_SET)

#define NRF24L01_IRQ_CLK_ENABLE()                     __HAL_RCC_GPIOB_CLK_ENABLE()
#define NRF24L01_IRQ_PORT                             GPIOB
#define NRF24L01_IRQ_PIN                              GPIO_PIN_6
#define NRF24L01_IRQ_PIN_READ()                       HAL_GPIO_ReadPin(NRF24L01_IRQ_PORT,NRF24L01_IRQ_PIN)

//NRF24L01寄存器操作命令
#define NRF_READ_REG         0x00  //读配置寄存器，低5位为寄存器地址
#define NRF_WRITE_REG        0x20  //写配置寄存器，低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据，1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据，1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器，发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器，接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据，CE为高，数据包被不断发送
#define NOP             0xFF  //空操作，可以用来读状态寄存器
//SPI(NRF24L01) 寄存器地址
#define CONFIG          0x00  //配置寄存器地址：bit0:1 接收模式 ，0：发射模式  bit 1 ：电选择  bit 2: CRC模式  bit 3 ：CRC使能
                              //bit4 ：中断MAX RT　(达到最大重发次数中断)使能  bit 5 : 中断 TX_DS 使能 ,bit 6 : 中断RX_DR 使能
#define EN_AA           0x01  //使能自动应答功能， bit 0~5 对应通道0~5
#define EN_RXADDR       0x02  //接收地址允许，bit 0~5 对应通道 0~5
#define SETUP_AW        0x03  //设置地址宽度（所有数据通道）bit1, 0:00 3字节 ；01，4字节 ；02，5字节；
#define SETUP_RETR      0x04  //建立自动重发；bit3:0,自动重发计数器；bit 7，4 ，自动重发延时  250*x+86us
#define RF_CH           0x05  //RF通道，bit6:0,工作通道频率
#define RF_SETUP        0x06  //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define STATUS          0x07  //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
                              //bit5:数据发送完成中断;bit6:数据发送接收中断;
#define MAX_TX  	0x1e  	  //达到最大发送次数中断
#define TX_OK   	0x2e  	  //TX发送完成中断
#define RX_OK   	0x40  	  //RX接收到数据中断

#define OBSERVE_TX      0x08  //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define CD              0x09  //载波检测寄存器,bit0,载波检测;
#define RX_ADDR_P0      0x0A  //数据通道0接收地址，最大长度5个字节，低字节在前
#define RX_ADDR_P1      0x0B  //数据通道1接收地址，最大长度5个字节，低字节在前
#define RX_ADDR_P2      0x0C  //数据通道2接收地址，最低字节可设置，高字节，必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3      0x0D  //数据通道3接收地址，最低字节可设置，高字节，必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4      0x0E  //数据通道4接收地址，最低字节可设置，高字节，必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5      0x0F  //数据通道5接收地址，最低字节可设置，高字节，必须同RX_ADDR_P1[39:8]相等;
#define TX_ADDR         0x10  //发送地址（低字节在前）ShockBurstTM模式。RX_ADDR P0 与此地址相等
#define RX_PW_P0        0x11  //接收数据通道0有效数据宽度（1~32字节），设置为0则非法
#define RX_PW_P1        0x12  //接收数据通道1有效数据宽度（1~32字节），设置为0则非法
#define RX_PW_P2        0x13  //接收数据通道2有效数据宽度（1~32字节），设置为0则非法
#define RX_PW_P3        0x14  //接收数据通道3有效数据宽度（1~32字节），设置为0则非法
#define RX_PW_P4        0x15  //接收数据通道4有效数据宽度（1~32字节），设置为0则非法
#define RX_PW_P5        0x16  //接收数据通道5有效数据宽度（1~32字节），设置为0则非法
#define FIFO_STATUS     0x17  //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
                              //bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一次数据包0，不循环;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//24L01操作线
#define NRF24L01_CE   PDout(2) // SPI片选信号
#define NRF24L01_CSN  PBout(5) //24L01片选信号
#define NRF24L01_IRQ  PBin(6)  //IRQ主机数据输入

//24L01发送接收数据宽度定义
#define TX_ADR_WIDTH    5   //5字节地址宽度
#define RX_ADR_WIDTH    5   //5字节地址宽度
#define TX_PLOAD_WIDTH  32  //20字节的用户数据宽度
#define RX_PLOAD_WIDTH  32  //20字节的用户数据宽度


//key状态获取
#define  KEY0   HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)
#define  KEY1   HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define  KEY2  HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)
#define  KEY3  HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)


//CAN 通讯


/* 扩展变量 ------------------------------------------------------------------*/
extern SPI_HandleTypeDef hspi1;
#define hspi_NRF24L01 hspi1

/* 函数声明 ------------------------------------------------------------------*/

void NRF24L01_SPI_Init(void);
void NRF24L01_RX_Mode(void);					//配置为接收模式
void NRF24L01_TX_Mode(void);					//配置为发送模式
uint8_t NRF24L01_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uint8_ts);//写数据区
uint8_t NRF24L01_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uint8_ts);	//读数据区
uint8_t NRF24L01_Read_Reg(uint8_t reg);					//读寄存器
uint8_t NRF24L01_Write_Reg(uint8_t reg, uint8_t value);		//写寄存器
uint8_t NRF24L01_Check(void);						//检查NRF2401 是否存在
uint8_t NRF24L01_TxPacket(uint8_t *txbuf);				//发送一个数据包
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf);				//接收一个数据包
void NRF_Address_Change(uint8_t i);                     //更改接收发送的地址
void EXTI_NRF_ISR(uint8_t *rxbuf);						//根据nrf24L01的给出的状态进入中断
uint8_t NRF24L01_SendMessage(uint8_t channel,uint8_t *txbuf );    //发送消息
uint8_t NRF24L01_RXOK(uint8_t channel);							//接收信息OK，进行反馈
uint8_t NRF24L01_TXOK(uint8_t channel);			//判断是否发宋成功
void CodeAction(uint8_t *buf);
void SendLine(uint8_t num);
void Search(void);					//询
void NRF_Power_Off(void);
void NRF24L01_RT_Init(void);
void Send(void);  //232发送消息
void CAN1_Config(void);
uint8_t Can_TxMessage(uint8_t ide,uint32_t id,uint8_t len,uint8_t *data);
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/*
 * 定义变量
 */
uint8_t rs232txbuf[10];				//rs232发送接收
uint8_t rs232rxbuf[10];				//rs232接收数据
uint8_t IDFlag;					//发送中的标志
uint8_t IDbuf[10];				//ID卡号
uint8_t LineFlag;
uint8_t Line[10];
uint8_t nrftxbuf[10];				//nrf24L01发送数据
uint8_t nrfrxbuf[10];				//nff24L01接收数据
uint8_t NRFstate;						//nfr24L01 的状态
uint8_t TX_IRQ;						//nfr24L01 发送是否触发
uint8_t NRFFlag;                    //无线通讯可以标志位
uint8_t  Num;						//定义编号
uint8_t CAN_Flag;					//CAN 接收信息标志

CAN_HandleTypeDef hcan;

CAN_TxHeaderTypeDef   TxHeader;
CAN_RxHeaderTypeDef   RxHeader;

uint8_t               TxData[8];

uint8_t               RxData[8];
uint32_t              TxMailbox;


#endif /* INC_USERCONFIG_H_ */
